package org.yefei.homeworkday09;

import java.util.Scanner;

/**
 * 吃货联盟订餐系统
 */
public class OrderingSystem {
	public static void main(String[] args) {
		// 数据主体：一组订单信息
		String[] names = new String[4];// 订餐人
		String[] dishMegs = new String[4];// 所定餐品信息
		int[] times = new int[4];// 送餐时间
		String[] addresses = new String[4];// 送餐地址
		int[] states = new int[4];// 订餐状态 0：已预订 1：已完成
		double[] sumPrices = new double[4];// 总金额

		// 初始化2条订单信息
		names[0] = "张三";
		dishMegs[0] = "鱼香肉丝 1份";
		times[0] = 12;
		addresses[0] = "上海路501号";
		states[0] = 0;
		sumPrices[0] = 18;

		names[1] = "李四";
		dishMegs[1] = "肉末茄子 3份";
		times[1] = 12;
		addresses[1] = "宁波路520号";
		states[1] = 1;
		sumPrices[1] = 66;

		// 一组餐品信息
		String[] dishNames = { "鱼香肉丝", "肉末茄子", "蔬菜沙拉" };
		double[] prices = { 18.0, 22.0, 16.0 };
		int[] praiseNum = new int[3];

		// 循环（do-while）
		int num = -1;// 记录用户输入的数字
		Scanner sc = new Scanner(System.in);
		do {
			// 循环操作：
			// 显示主菜单
			System.out.println("***************************************");
			System.out.println("\t\t1.我要订餐");
			System.out.println("\t\t2.查看餐袋");
			System.out.println("\t\t3.签收订单");
			System.out.println("\t\t4.删除订单");
			System.out.println("\t\t5.我要点赞");
			System.out.println("\t\t6.退出程序");
			System.out.println("***************************************");

			// 提示用户输入功能编号，并执行相应功能
			System.out.print("请选择：");
			int choose = sc.nextInt();
			boolean isAdd = false;// true：记录一个为空的位置，可以插入 false：没找到
			switch (choose) {
			case 1:
				// 我要订餐
				System.out.println("***************我要订餐****************");
				// 1.查找要插入的位置，记录下来
				for (int i = 0; i < names.length; i++) {
					if (names[i] == null) {
						isAdd = true;
						// 执行插入操作
						// a.显示所有可供选择的餐品信息
						System.out.println("序号\t餐品名\t单价\t点赞数");
						for (int j = 0; j < dishNames.length; j++) {
							String price = prices[j] + "元";
							String praise = praiseNum[j] + "赞";
							System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + price + "\t" + praise);
						}

						// 输入所选餐品编号以及分数
						System.out.print("请选择所订餐品的序号：");
						int chooseDish = sc.nextInt();
						System.out.print("请选择所定餐数：");
						int number = sc.nextInt();
						String disMeg = dishNames[chooseDish - 1] + " " + number + "份";

						// b.输入订餐人姓名
						System.out.print("请输入订餐人姓名：");
						String name = sc.next();

						// c.输入送餐时间
						System.out.print("请输入送餐时间（10~20整点送餐）：");
						int time = sc.nextInt();
						// 如果输错了，重复输入
						while (time < 10 || time > 20) {
							System.out.print("对不起，您的输入有误！请重新输入：");
							time = sc.nextInt();
						}

						// d.输入送餐地址
						System.out.print("请输入送餐地址：");
						String address = sc.next();

						// e.计算餐费
						double sumPrice = prices[chooseDish - 1] * number;
						// 送餐费,当餐费达到50元时，免6元餐费
						double deliCharge = sumPrice >= 50 ? 0.0 : 6.0;

						// 显示订单信息
						System.out.println("订单成功！");
						System.out.println("您订的是：" + disMeg);
						System.out.println("订餐人：" + name);
						System.out.println("送餐时间：" + time + "点");
						System.out.println("送餐地址：" + address);
						System.out.println("餐费：" + sumPrice + "，送餐费：" + deliCharge + "元");
						System.out.println("总金额：" + (sumPrice + deliCharge) + "元");

						// 保存数据
						names[i] = name;
						dishMegs[i] = disMeg;
						times[i] = time;
						addresses[i] = address;
						sumPrices[i] = sumPrice + deliCharge;
						break;
					}
				}
				// 如果没有找到为空的位置，记录下来
				if (!isAdd) {
					System.out.println("对不起您的餐袋已满！");
				}
				break;
			case 2:
				// 查看餐袋
				System.out.println("***************查看餐袋****************");
				System.out.println("序号\t订餐人\t所定餐品信息\t送餐时间\t送餐地址\t\t总金额\t状态");
				// 遍历数组
				for (int i = 0; i < names.length; i++) {
					if (names[i] != null) {
						String time = times[i] + "点";
						String sumPrice = sumPrices[i] + "元";
						String state = states[i] == 0 ? "已预订" : "已完成";
						System.out.println((i + 1) + "\t" + names[i] + "\t" + dishMegs[i] + "\t" + time + "\t"
								+ addresses[i] + "\t" + sumPrice + "\t" + state);
					}
				}
				break;
			case 3:
				// 签收订单
				System.out.println("***************签收订单****************");
				// 要求用户输入一个签收订单序号
				System.out.print("请输入要签收的订单序号");
				int signOrederId = sc.nextInt();
				boolean isFind = false;// 记录是否找到了这条订单true：已找到 false：未找到
				// 查找这条订单（循环遍历）
				for (int i = 0; i < names.length; i++) {
					// 1、找到，状态是已完成（已签收完毕）：提示不能再次签收
					// 2、找到,状态是已预订（没有完成签收）：可以签收
					if (names[i] != null && states[i] == 1 && signOrederId == i + 1) {
						System.out.println("对不起，您选择的订单已经完成签收，不能再次签收！");
						isFind = true;
						break;
					} else if (names[i] != null && states[i] == 0 && signOrederId == i + 1) {
						states[i] = 1;// 状态值改为已完成状态
						System.out.println("订单已签收成功");
						isFind = true;
						break;
					}
				}
				// 条件判断：如果没找到这条订单，才去提示没有找到
				// 3、没找到，提示信息没找到
				if (!isFind) {
					System.out.println("对不起，此订单不存在");
				}
				break;
			case 4:
				// 删除订单
				// 1.输入要删除的订单序号(从1开始)
				System.out.println("**************删除订单****************");
				System.out.print("请输入要删除的订单序号：");
				int delId = sc.nextInt();
				int delIndex = -1;// 删除订单的下标
				boolean isDelFind = false;// 记录是否找到此条订单，true：找到了 false：未找到
				// 2.循环查找这条订单
				for (int i = 0; i < names.length; i++) {
					// 找到此订单，已签收：执行删除操作
					// 找到此订单，且未签收：提示信息
					if (names[i] != null && states[i] == 1 && delId == i + 1) {
						delIndex = i;
						isDelFind = true;
						break;
					} else if (names[i] != null && states[i] == 0 && delId == i + 1) {
						System.out.println("不可删除，此订单未签收");
						isDelFind = true;
						break;
					}
				}
				// 未找到此订单：提示信息
				if (!isDelFind) {
					System.out.println("此条订单不存在");
				}

				// 执行删除
				if (delIndex != -1) {
					// 删除操作（循环移位）
					// 从要删除的元素后面一个开始，到数组最后一个元素依次向前移一位
					for (int i = delIndex + 1; i <= names.length - 1; i++) {
						names[i - 1] = names[i];
						dishMegs[i - 1] = dishMegs[i];
						times[i - 1] = times[i];
						addresses[i - 1] = addresses[i];
						states[i - 1] = states[i];
					}
					// 最后一位清空
					names[names.length - 1] = null;
					dishMegs[names.length - 1] = null;
					times[names.length - 1] = 0;
					addresses[names.length - 1] = null;
					states[names.length - 1] = 0;

					System.out.println("订单删除成功！");
				}
				break;
			case 5:
				// 我要点赞
				System.out.println("***************我要点赞****************");
				// 1.显示供点赞的餐品列表
				System.out.println("序号\t餐品名\t\t单价\t\t点赞数");
				for (int j = 0; j < dishNames.length; j++) {
					String price = prices[j] + "元";
					String praise = praiseNum[j] + "赞";
					System.out.println((j + 1) + "\t\t" + dishNames[j] + "\t" + price + "\t\t" + praise);
				}
				// 2.输入要点赞的餐品序号
				System.out.print("请输入要点赞的餐品序号：");
				int dishId = sc.nextInt();
				// 3.该序号的餐品点赞数加1
				praiseNum[dishId - 1]++;
				// 4.显示
				System.out.println("点赞成功！");
				System.out.println(dishNames[dishId - 1] + " " + praiseNum[dishId - 1] + "赞");
				break;
			case 6:
				// 退出程序
			default:
				break;
			}
			// 当用户输入的功能编号为1~5之外的数字时推出循环，否则提示输入0返回
			if (choose < 1 || choose > 5) {
				break;
			} else {
				// 提示输入0返回
				System.out.print("输入0返回：");
				num = sc.nextInt();
			}
		} while (num == 0);
		System.out.println("谢谢使用，欢迎下次光临。");
	}
}
